package offer;

import listNodePractice.ListNode;

public class  Offer52 {

    //TODO:2023/7/23  上面这个是我理解之后我写的
    // 寻找第一个公共节点是真的两个节点是相同的 是同一个节点 而不是只有数值相等 必须是同一个对象同一个节点
    public ListNode findFirstCommonNode(ListNode pHead1, ListNode pHead2) {

         ListNode p1=pHead1;
         ListNode p2=pHead2;

         while (p1!=null&&p2!=null){
             if (p1.val== p2.val){
                 return  p1;
             }
             if (p1.next!=null){
                 p1=p1.next;
             }else {
                 p1=pHead2;
             }
             if (p2.next!=null){
                 p2=p2.next;
             }else {
                 p2=pHead1;
             }
         }
         return  null;


    }


    //TODO:2023/7/23   下面的这种写法 也能把没有第一个公共节点的情况给cover住
    //TODO:2023/7/23 寻找第一个公共节点和判断链表是否存在公共节点 属于同一道题目
    ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        // p1 指向 A 链表头结点，p2 指向 B 链表头结点
        ListNode p1 = headA, p2 = headB;
        while (p1 != p2) {
            // p1 走一步，如果走到 A 链表末尾，转到 B 链表
            if (p1 == null) p1 = headB;
            else            p1 = p1.next;
            // p2 走一步，如果走到 B 链表末尾，转到 A 链表
            if (p2 == null) p2 = headA;
            else            p2 = p2.next;
        }
        return p1;
    }

    public static void main(String[] args) {
        ListNode listNode1 = new ListNode(1);
        ListNode listNode2 = new ListNode(2);
        ListNode listNode3 = new ListNode(3);
        ListNode listNode4 = new ListNode(4);
        ListNode listNode5 = new ListNode(5);
        listNode1.next=listNode2;
        listNode2.next=listNode3;
        listNode3.next=listNode4;
        listNode4.next=listNode5;

        ListNode listNode11 = new ListNode(6);
        ListNode listNode33 = new ListNode(3);
        ListNode listNode77 = new ListNode(7);
        listNode11.next=listNode33;
        listNode33.next=listNode77;


        Offer52 offer52 = new Offer52();
        ListNode firstCommonNode = offer52.findFirstCommonNode(listNode1, listNode11);
        System.out.println(firstCommonNode.val);

    }
}
